<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/Python-3.6.2/Include/setobject.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/Python-3.6.2/Include/setobject.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="k">/* Set object interface */</span>
<a name="2" /><span class="True">       2:</span> 
<a name="3" /><span class="True">       3:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="macros_noref.html#_UHlfU0VUT0JKRUNUX0hfMA__"><span class="b">Py_SETOBJECT_H</span></a>
<a name="4" /><span class="True">       4:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlfU0VUT0JKRUNUX0hfMA__"><span class="b">Py_SETOBJECT_H</span></a>
<a name="5" /><span class="False">       5:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">__cplusplus</span>
<a name="6" /><span class="False">       6:</span> <span class="m">extern</span> <span class="e">&quot;C&quot;</span> <span class="f">{</span>
<a name="7" /><span class="True">       7:</span> <span class="f">#</span><span class="n">endif</span>
<a name="8" /><span class="True">       8:</span> 
<a name="9" /><span class="True">       9:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="10" /><span class="True">      10:</span> 
<a name="11" /><span class="True">      11:</span> <span class="k">/* There are three kinds of entries in the table:</span>
<a name="12" /><span class="True">      12:</span> <span class="k"></span>
<a name="13" /><span class="True">      13:</span> <span class="k">1. Unused:  key == NULL and hash == 0</span>
<a name="14" /><span class="True">      14:</span> <span class="k">2. Dummy:   key == dummy and hash == -1</span>
<a name="15" /><span class="True">      15:</span> <span class="k">3. Active:  key != NULL and key != dummy and hash != -1</span>
<a name="16" /><span class="True">      16:</span> <span class="k"></span>
<a name="17" /><span class="True">      17:</span> <span class="k">The hash field of Unused slots is always zero.</span>
<a name="18" /><span class="True">      18:</span> <span class="k"></span>
<a name="19" /><span class="True">      19:</span> <span class="k">The hash field of Dummy slots are set to -1</span>
<a name="20" /><span class="True">      20:</span> <span class="k">meaning that dummy entries can be detected by</span>
<a name="21" /><span class="True">      21:</span> <span class="k">either entry-&gt;key==dummy or by entry-&gt;hash==-1.</span>
<a name="22" /><span class="True">      22:</span> <span class="k">*/</span>
<a name="23" /><span class="True">      23:</span> 
<a name="24" /><span class="True">      24:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_ref.html#_UHlTZXRfTUlOU0laRV8w"><span class="b">PySet_MINSIZE</span></a> <span class="c">8</span>
<a name="25" /><span class="True">      25:</span> 
<a name="26" /><span class="True">      26:</span> <span class="m">typedef</span> <span class="m">struct</span> <span class="f">{</span>
<a name="27" /><span class="True">      27:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">key</span><span class="f">;</span>
<a name="28" /><span class="True">      28:</span>     <span class="b">Py_hash_t</span> <span class="b">hash</span><span class="f">;</span>             <span class="k">/* Cached hash code of the key */</span>
<a name="29" /><span class="True">      29:</span> <span class="f">}</span> <span class="b">setentry</span><span class="f">;</span>
<a name="30" /><span class="True">      30:</span> 
<a name="31" /><span class="True">      31:</span> <span class="k">/* The SetObject data structure is shared by set and frozenset objects.</span>
<a name="32" /><span class="True">      32:</span> <span class="k"></span>
<a name="33" /><span class="True">      33:</span> <span class="k">Invariant for sets:</span>
<a name="34" /><span class="True">      34:</span> <span class="k"> - hash is -1</span>
<a name="35" /><span class="True">      35:</span> <span class="k"></span>
<a name="36" /><span class="True">      36:</span> <span class="k">Invariants for frozensets:</span>
<a name="37" /><span class="True">      37:</span> <span class="k"> - data is immutable.</span>
<a name="38" /><span class="True">      38:</span> <span class="k"> - hash is the hash of the frozenset or -1 if not computed yet.</span>
<a name="39" /><span class="True">      39:</span> <span class="k"></span>
<a name="40" /><span class="True">      40:</span> <span class="k">*/</span>
<a name="41" /><span class="True">      41:</span> 
<a name="42" /><span class="True">      42:</span> <span class="m">typedef</span> <span class="m">struct</span> <span class="f">{</span>
<a name="43" /><span class="True">      43:</span>     <a href="macros_ref.html#_UHlPYmplY3RfSEVBRF8w"><span class="b">PyObject_HEAD</span></a>
<a name="44" /><span class="True">      44:</span> 
<a name="45" /><span class="True">      45:</span>     <span class="b">Py_ssize_t</span> <span class="b">fill</span><span class="f">;</span>            <span class="k">/* Number active and dummy entries*/</span>
<a name="46" /><span class="True">      46:</span>     <span class="b">Py_ssize_t</span> <span class="b">used</span><span class="f">;</span>            <span class="k">/* Number active entries */</span>
<a name="47" /><span class="True">      47:</span> 
<a name="48" /><span class="True">      48:</span>     <span class="k">/* The table contains mask + 1 slots, and that&apos;s a power of 2.</span>
<a name="49" /><span class="True">      49:</span> <span class="k">     * We store the mask instead of the size because the mask is more</span>
<a name="50" /><span class="True">      50:</span> <span class="k">     * frequently needed.</span>
<a name="51" /><span class="True">      51:</span> <span class="k">     */</span>
<a name="52" /><span class="True">      52:</span>     <span class="b">Py_ssize_t</span> <span class="b">mask</span><span class="f">;</span>
<a name="53" /><span class="True">      53:</span> 
<a name="54" /><span class="True">      54:</span>     <span class="k">/* The table points to a fixed-size smalltable for small tables</span>
<a name="55" /><span class="True">      55:</span> <span class="k">     * or to additional malloc&apos;ed memory for bigger tables.</span>
<a name="56" /><span class="True">      56:</span> <span class="k">     * The table pointer is never NULL which saves us from repeated</span>
<a name="57" /><span class="True">      57:</span> <span class="k">     * runtime null-tests.</span>
<a name="58" /><span class="True">      58:</span> <span class="k">     */</span>
<a name="59" /><span class="True">      59:</span>     <span class="b">setentry</span> <span class="f">*</span><span class="b">table</span><span class="f">;</span>
<a name="60" /><span class="True">      60:</span>     <span class="b">Py_hash_t</span> <span class="b">hash</span><span class="f">;</span>             <span class="k">/* Only used by frozenset objects */</span>
<a name="61" /><span class="True">      61:</span>     <span class="b">Py_ssize_t</span> <span class="b">finger</span><span class="f">;</span>          <span class="k">/* Search finger for pop() */</span>
<a name="62" /><span class="True">      62:</span> 
<a name="63" /><span class="True">      63:</span>     <span class="b">setentry</span> <span class="b">smalltable</span><span class="f">[</span><a href="macros_ref.html#_UHlTZXRfTUlOU0laRV8w"><span class="b">PySet_MINSIZE</span></a><span class="f">]</span><span class="f">;</span>
<a name="64" /><span class="True">      64:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">weakreflist</span><span class="f">;</span>      <span class="k">/* List of weak references */</span>
<a name="65" /><span class="True">      65:</span> <span class="f">}</span> <span class="b">PySetObject</span><span class="f">;</span>
<a name="66" /><span class="True">      66:</span> 
<a name="67" /><span class="True">      67:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_ref.html#_UHlTZXRfR0VUX1NJWkVfMA__"><span class="b">PySet_GET_SIZE</span></a><span class="f">(</span><span class="b">so</span><span class="f">)</span> <span class="f">(</span><span class="f">(</span><span class="f">(</span><span class="b">PySetObject</span> <span class="f">*</span><span class="f">)</span><span class="f">(</span><span class="b">so</span><span class="f">)</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">used</span><span class="f">)</span>
<a name="68" /><span class="True">      68:</span> 
<a name="69" /><span class="True">      69:</span> <a href="macros_ref.html#_UHlBUElfREFUQV8w"><span class="b">PyAPI_DATA</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">_PySet_Dummy</span><span class="f">;</span>
<a name="70" /><span class="True">      70:</span> 
<a name="71" /><span class="True">      71:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">_PySet_NextEntry</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="b">set</span><span class="f">,</span> <span class="b">Py_ssize_t</span> <span class="f">*</span><span class="b">pos</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="f">*</span><span class="b">key</span><span class="f">,</span> <span class="b">Py_hash_t</span> <span class="f">*</span><span class="b">hash</span><span class="f">)</span><span class="f">;</span>
<a name="72" /><span class="True">      72:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">_PySet_Update</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="b">set</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="b">iterable</span><span class="f">)</span><span class="f">;</span>
<a name="73" /><span class="True">      73:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">PySet_ClearFreeList</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="74" /><span class="True">      74:</span> 
<a name="75" /><span class="True">      75:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* Section excluded by Py_LIMITED_API */</span>
<a name="76" /><span class="True">      76:</span> 
<a name="77" /><span class="True">      77:</span> <a href="macros_ref.html#_UHlBUElfREFUQV8w"><span class="b">PyAPI_DATA</span></a><span class="f">(</span><span class="b">PyTypeObject</span><span class="f">)</span> <span class="b">PySet_Type</span><span class="f">;</span>
<a name="78" /><span class="True">      78:</span> <a href="macros_ref.html#_UHlBUElfREFUQV8w"><span class="b">PyAPI_DATA</span></a><span class="f">(</span><span class="b">PyTypeObject</span><span class="f">)</span> <span class="b">PyFrozenSet_Type</span><span class="f">;</span>
<a name="79" /><span class="True">      79:</span> <a href="macros_ref.html#_UHlBUElfREFUQV8w"><span class="b">PyAPI_DATA</span></a><span class="f">(</span><span class="b">PyTypeObject</span><span class="f">)</span> <span class="b">PySetIter_Type</span><span class="f">;</span>
<a name="80" /><span class="True">      80:</span> 
<a name="81" /><span class="True">      81:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PySet_New</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="82" /><span class="True">      82:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyFrozenSet_New</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="83" /><span class="True">      83:</span> 
<a name="84" /><span class="True">      84:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">PySet_Add</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="b">set</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="b">key</span><span class="f">)</span><span class="f">;</span>
<a name="85" /><span class="True">      85:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">PySet_Clear</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="b">set</span><span class="f">)</span><span class="f">;</span>
<a name="86" /><span class="True">      86:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">PySet_Contains</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="b">anyset</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="b">key</span><span class="f">)</span><span class="f">;</span>
<a name="87" /><span class="True">      87:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">PySet_Discard</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="b">set</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="b">key</span><span class="f">)</span><span class="f">;</span>
<a name="88" /><span class="True">      88:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PySet_Pop</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="b">set</span><span class="f">)</span><span class="f">;</span>
<a name="89" /><span class="True">      89:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">Py_ssize_t</span><span class="f">)</span> <span class="b">PySet_Size</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="b">anyset</span><span class="f">)</span><span class="f">;</span>
<a name="90" /><span class="True">      90:</span> 
<a name="91" /><span class="True">      91:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlGcm96ZW5TZXRfQ2hlY2tFeGFjdF8w"><span class="b">PyFrozenSet_CheckExact</span></a><span class="f">(</span><span class="b">ob</span><span class="f">)</span> <span class="f">(</span><a href="macros_ref.html#_UHlfVFlQRV8w"><span class="b">Py_TYPE</span></a><span class="f">(</span><span class="b">ob</span><span class="f">)</span> <span class="f">==</span> <span class="f">&amp;</span><span class="b">PyFrozenSet_Type</span><span class="f">)</span>
<a name="92" /><span class="True">      92:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_ref.html#_UHlBbnlTZXRfQ2hlY2tFeGFjdF8w"><span class="b">PyAnySet_CheckExact</span></a><span class="f">(</span><span class="b">ob</span><span class="f">)</span> \
<a name="93" /><span class="True">      93:</span>     <span class="f">(</span><a href="macros_ref.html#_UHlfVFlQRV8w"><span class="b">Py_TYPE</span></a><span class="f">(</span><span class="b">ob</span><span class="f">)</span> <span class="f">==</span> <span class="f">&amp;</span><span class="b">PySet_Type</span> <span class="f">||</span> <a href="macros_ref.html#_UHlfVFlQRV8w"><span class="b">Py_TYPE</span></a><span class="f">(</span><span class="b">ob</span><span class="f">)</span> <span class="f">==</span> <span class="f">&amp;</span><span class="b">PyFrozenSet_Type</span><span class="f">)</span>
<a name="94" /><span class="True">      94:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_ref.html#_UHlBbnlTZXRfQ2hlY2tfMA__"><span class="b">PyAnySet_Check</span></a><span class="f">(</span><span class="b">ob</span><span class="f">)</span> \
<a name="95" /><span class="True">      95:</span>     <span class="f">(</span><a href="macros_ref.html#_UHlfVFlQRV8w"><span class="b">Py_TYPE</span></a><span class="f">(</span><span class="b">ob</span><span class="f">)</span> <span class="f">==</span> <span class="f">&amp;</span><span class="b">PySet_Type</span> <span class="f">||</span> <a href="macros_ref.html#_UHlfVFlQRV8w"><span class="b">Py_TYPE</span></a><span class="f">(</span><span class="b">ob</span><span class="f">)</span> <span class="f">==</span> <span class="f">&amp;</span><span class="b">PyFrozenSet_Type</span> <span class="f">||</span> \
<a name="96" /><span class="True">      96:</span>       <span class="b">PyType_IsSubtype</span><span class="f">(</span><a href="macros_ref.html#_UHlfVFlQRV8w"><span class="b">Py_TYPE</span></a><span class="f">(</span><span class="b">ob</span><span class="f">)</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">PySet_Type</span><span class="f">)</span> <span class="f">||</span> \
<a name="97" /><span class="True">      97:</span>       <span class="b">PyType_IsSubtype</span><span class="f">(</span><a href="macros_ref.html#_UHlfVFlQRV8w"><span class="b">Py_TYPE</span></a><span class="f">(</span><span class="b">ob</span><span class="f">)</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">PyFrozenSet_Type</span><span class="f">)</span><span class="f">)</span>
<a name="98" /><span class="True">      98:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlTZXRfQ2hlY2tfMA__"><span class="b">PySet_Check</span></a><span class="f">(</span><span class="b">ob</span><span class="f">)</span> \
<a name="99" /><span class="True">      99:</span>     <span class="f">(</span><a href="macros_ref.html#_UHlfVFlQRV8w"><span class="b">Py_TYPE</span></a><span class="f">(</span><span class="b">ob</span><span class="f">)</span> <span class="f">==</span> <span class="f">&amp;</span><span class="b">PySet_Type</span> <span class="f">||</span> \
<a name="100" /><span class="True">     100:</span>     <span class="b">PyType_IsSubtype</span><span class="f">(</span><a href="macros_ref.html#_UHlfVFlQRV8w"><span class="b">Py_TYPE</span></a><span class="f">(</span><span class="b">ob</span><span class="f">)</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">PySet_Type</span><span class="f">)</span><span class="f">)</span>
<a name="101" /><span class="True">     101:</span> <span class="f">#</span><span class="n">define</span>   <a href="macros_noref.html#_UHlGcm96ZW5TZXRfQ2hlY2tfMA__"><span class="b">PyFrozenSet_Check</span></a><span class="f">(</span><span class="b">ob</span><span class="f">)</span> \
<a name="102" /><span class="True">     102:</span>     <span class="f">(</span><a href="macros_ref.html#_UHlfVFlQRV8w"><span class="b">Py_TYPE</span></a><span class="f">(</span><span class="b">ob</span><span class="f">)</span> <span class="f">==</span> <span class="f">&amp;</span><span class="b">PyFrozenSet_Type</span> <span class="f">||</span> \
<a name="103" /><span class="True">     103:</span>       <span class="b">PyType_IsSubtype</span><span class="f">(</span><a href="macros_ref.html#_UHlfVFlQRV8w"><span class="b">Py_TYPE</span></a><span class="f">(</span><span class="b">ob</span><span class="f">)</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">PyFrozenSet_Type</span><span class="f">)</span><span class="f">)</span>
<a name="104" /><span class="True">     104:</span> 
<a name="105" /><span class="False">     105:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">__cplusplus</span>
<a name="106" /><span class="False">     106:</span> <span class="f">}</span>
<a name="107" /><span class="True">     107:</span> <span class="f">#</span><span class="n">endif</span>
<a name="108" /><span class="True">     108:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* !Py_SETOBJECT_H */</span>
<a name="109" /><span class="True">     109:</span> </pre>
  </body>
</html>
